package com.ikas.ai.enums;

import javax.validation.constraints.NotNull;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 枚举基类
 *
 * @param <E>
 * @param <T>
 * @author admin
 */
public interface BaseEnum<E extends Enum<?>, T> {

    /**
     * 唯一编码
     *
     * @return T 泛型对象
     * @author ly
     */
    T code();

    /**
     * 描述
     *
     * @return 描述
     * @author ly
     */
    String desc();

    /**
     * 根据value获取枚举
     *
     * @param eClass 枚举类对象
     * @param value  泛型值
     * @param <E>    枚举泛型
     * @param <T>    value泛型
     * @return 枚举
     */
    static <E extends BaseEnum<?, ?>, T> Optional<E> of(Class<E> eClass, T value) {
        if (value == null || eClass == null) {
            return Optional.empty();
        }
        for (E e : eClass.getEnumConstants()) {
            Object eValue = e.code();
            if (eValue == value || eValue.equals(value)) {
                return Optional.of(e);
            }
        }
        return Optional.empty();
    }

    /**
     * 转换成列表
     *
     * @param eClass  枚举类对象
     * @param convert 转换器
     * @return 列表
     */
    static <E extends BaseEnum<?, ?>, R> List<R> toList(Class<E> eClass, @NotNull Function<E, R> convert) {
        if (eClass == null) {
            return Collections.emptyList();
        }
        return Arrays.stream(eClass.getEnumConstants()).map(convert).collect(Collectors.toList());
    }

    /**
     * 判断相等 - 基于T泛型
     *
     * @param t 泛型T的值
     * @return boolean
     * @author ly
     */
    default boolean eq(T t) {
        return code().equals(t);
    }
}